home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / dmove86 / dmsort.c < prev    next >
Text File  |  1994-10-01  |  3KB  |  169 lines

  1. /*
  2.  
  3. dmsort.c --- ソート処理ルーチン
  4.  
  5. Copyright (c) 1993,94 Delmonta
  6.  
  7. */
  8.  
  9. #include<stdio.h>
  10. #include<stdlib.h>
  11. #include<farstr.h>
  12. #include<dos.h>
  13. #include"dmove86.h"
  14.  
  15. static    int    cmpfname(struct DIRENTRY far **p,struct DIRENTRY far **q)
  16. {
  17.     return    far_strncmp((*p)->filename,(*q)->filename,11);
  18. }
  19.  
  20. static    int    cmpftime(struct DIRENTRY far **p,struct DIRENTRY far **q)
  21. {
  22.     register unsigned short    a,b;
  23.  
  24.     a = (*p)->date;
  25.     b = (*q)->date;
  26.  
  27.     if    (a!=b)
  28.         return a-b;
  29.  
  30.     return (*p)->time - (*q)->time;
  31. }
  32.  
  33. static    int    cmpextname(struct DIRENTRY far **p,struct DIRENTRY far **q)
  34. {
  35.     register int    a;
  36.  
  37.     a = far_strncmp((*p)->extname,(*q)->extname,3);
  38.     if    (a)
  39.         return a;
  40.     else
  41.         return    far_strncmp((*p)->filename,(*q)->filename,8);
  42. }
  43.  
  44. static    int    cmpattr(struct DIRENTRY far **p,struct DIRENTRY far **q)
  45. {
  46.     int    a,b,x,y;
  47.  
  48.     a = (*p)->attr;
  49.     b = (*q)->attr;
  50.     x = y = 0;
  51.                     /* (1)ボリュームID    */
  52.     if    (a & _A_VOLID)        x += 0x40;
  53.     if    (b & _A_VOLID)        y += 0x40;
  54.                     /* (2)システムファイル    */
  55.     if    (a & _A_SYSTEM)        x += 0x20;
  56.     if    (b & _A_SYSTEM)        y += 0x20;
  57.                     /* (3)サブディレクトリ    */
  58.     if    (a & _A_SUBDIR)        x += 0x10;
  59.     if    (b & _A_SUBDIR)        y += 0x10;
  60.  
  61.     return y-x;
  62. }
  63.  
  64. static    int    cmpfsize(struct DIRENTRY far **p,struct DIRENTRY far **q)
  65. {
  66.     if    ((*p)->filesize <  (*q)->filesize)    return 1;
  67.     else if    ((*p)->filesize == (*q)->filesize)    return 0;
  68.     else                        return -1;
  69. }
  70.  
  71. static    int    Sortmode;    /* ソート基準(ファイル名/拡張子/日時/属性)    */
  72. static    int    Sorttype;    /* 昇順か降順か                */
  73.  
  74. #define    SORT_FILENAME    0
  75. #define    SORT_EXTNAME    1
  76. #define    SORT_TIMESTAMP    2
  77. #define    SORT_ATTR    3
  78. #define    SORT_FILESIZE    4
  79.  
  80. #define    SORT_UP        0
  81. #define    SORT_DOWN    1
  82.  
  83. static    int    cmpdirentry(struct DIRENTRY far **p,struct DIRENTRY far **q)
  84. {
  85.     register int    a,b;
  86.  
  87.     a = (*p)->filename[0] - (char)0xe5;    /* 例外処理:未使用エントリは */
  88.     b = (*q)->filename[0] - (char)0xe5;    /* 無条件で後ろに回す        */
  89.  
  90.     if    (a==0 && b==0)    return 0;
  91.     else if    (a!=0 && b==0)    return -1;
  92.     else if    (a==0 && b!=0)    return 1;
  93.  
  94.     a = (*p)->filename[0] - '.';    /* 例外処理:"."、".."は        */
  95.     b = (*q)->filename[0] - '.';    /* 無条件で先頭へ        */
  96.  
  97.     if    (a==0 && b==0)    return 0;
  98.     else if    (a!=0 && b==0)    return 1;
  99.     else if    (a==0 && b!=0)    return -1;
  100.  
  101.  
  102.     switch    (Sortmode)
  103.     {
  104.     case SORT_FILENAME:    a = cmpfname(p,q);    break;
  105.     case SORT_EXTNAME:    a = cmpextname(p,q);    break;
  106.     case SORT_TIMESTAMP:    a = cmpftime(p,q);    break;
  107.     case SORT_ATTR:        a = cmpattr(p,q);    break;
  108.     case SORT_FILESIZE:    a = cmpfsize(p,q);    break;
  109.     }
  110.  
  111.     if    (Sorttype == SORT_UP)
  112.         return a;
  113.     else
  114.         return -a;
  115. }
  116.  
  117. int    dmsort(unsigned s,unsigned e)
  118. {
  119. mode:
  120.     switch    (dm_errmes("ソート基準 F:ファイル名 E:拡張子 T:最終変更日時 A:属性 S:ファイルサイズ"))
  121.     {
  122.     case 'F':
  123.     case 'f':
  124.         Sortmode = SORT_FILENAME;
  125.         break;
  126.     case 'E':
  127.     case 'e':
  128.         Sortmode = SORT_EXTNAME;
  129.         break;
  130.     case 'T':
  131.     case 't':
  132.         Sortmode = SORT_TIMESTAMP;
  133.         break;
  134.     case 'A':
  135.     case 'a':
  136.         Sortmode = SORT_ATTR;
  137.         break;
  138.     case 'S':
  139.     case 's':
  140.         Sortmode = SORT_FILESIZE;
  141.         break;
  142.     case '\033':
  143.         return 0;
  144.     default:
  145.         putchar('\a');
  146.         goto    mode;
  147.     }
  148.  
  149. type:
  150.     switch    (dm_errmes("ソート順 U:昇順 D:降順"))
  151.     {
  152.     case 'u':
  153.     case 'U':
  154.         Sorttype = SORT_UP;
  155.         break;
  156.     case 'd':
  157.     case 'D':
  158.         Sorttype = SORT_DOWN;
  159.         break;
  160.     case '\033':
  161.         return 0;
  162.     default:
  163.         goto type;
  164.     }
  165.  
  166.     qsort(Dirtbl+s, e-s+1, sizeof(struct DIRENTRY far *), cmpdirentry);
  167.     return 1;
  168. }
  169.